package defi2;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;


import Utils.Compteur;
import Utils.EtudeStatistique;
import Utils.Utils;
import donnees.Variables;

public class TrouverCleVig {

	private String cle = "";
	private int longueurCle;
	private String messageCrypte = "";
	private String messageNettoye = "";
	private List<String> sequences = new ArrayList<String>();

	public TrouverCleVig(String messageCrypte, int longueurCle) {
		this.messageCrypte = messageCrypte;
		this.longueurCle = longueurCle;
		trouverCle();

	}

	public void trouverCle() {
		messageNettoye = Utils.nettoyerStringMaj(messageCrypte);
		remplirSequences();
		for (String c : sequences) {
			cle += analyserString(c);
		}
	}

	public void remplirSequences() {
		// On ajoute une sequence de caractere pour chaque caractere de la cle
		for (int i = 0; i < longueurCle; i++) {
			String s = "";
			sequences.add(s);
		}

		int indiceCourant = 0;

		for (int i = 0; i < messageNettoye.length(); i++) {
			sequences
					.set(indiceCourant,
							sequences.get(indiceCourant).concat(
									new Character(messageNettoye.charAt(i))
											.toString()));

			if (indiceCourant < longueurCle - 1) {
				indiceCourant++;
			} else {
				indiceCourant = 0;
			}
		}
	}

	public char analyserString(String s) {

		EtudeStatistique es = new EtudeStatistique(s);
		Map<Character, Compteur> map = es.getAlphabet();

		int valeurMax = 0;
		Character charMax = 'a';

		for (Entry<Character, Compteur> entry : map.entrySet()) {
			Character cle = entry.getKey();
			Compteur valeur = entry.getValue();
			// traitements

			if (valeur.getI() > valeurMax) {
				valeurMax = valeur.getI();
				charMax = cle;
			}
		}

		int indice = Utils.indice(charMax, Variables.majuscule);
		int decalage = Utils.modulo(
				indice - Utils.indice('E', Variables.majuscule),
				Variables.majuscule.length());
		charMax = Variables.majuscule.charAt(decalage);

		// System.out.println(map);
		// System.out.println("La lettre de la cle est : " + charMax);
		return charMax;
	}

	/**
	 * @return the cle
	 */
	public String getCle() {
		return cle;
	}

	/**
	 * @param cle
	 *            the cle to set
	 */
	public void setCle(String cle) {
		this.cle = cle;
	}

	/**
	 * @return the longueurCle
	 */
	public int getLongueurCle() {
		return longueurCle;
	}

	/**
	 * @param longueurCle
	 *            the longueurCle to set
	 */
	public void setLongueurCle(int longueurCle) {
		this.longueurCle = longueurCle;
	}

	/**
	 * @return the messageCrypte
	 */
	public String getMessageCrypte() {
		return messageCrypte;
	}

	/**
	 * @param messageCrypte
	 *            the messageCrypte to set
	 */
	public void setMessageCrypte(String messageCrypte) {
		this.messageCrypte = messageCrypte;
	}

	/**
	 * @return the messageNettoyer
	 */
	public String getMessageNettoye() {
		return messageNettoye;
	}

	/**
	 * @param messageNettoyer
	 *            the messageNettoyer to set
	 */
	public void setMessageNettoye(String messageNettoye) {
		this.messageNettoye = messageNettoye;
	}

	/**
	 * @return the sequences
	 */
	public List<String> getSequences() {
		return sequences;
	}

	/**
	 * @param sequences
	 *            the sequences to set
	 */
	public void setSequences(List<String> sequences) {
		this.sequences = sequences;
	}

}
